package com.hmyuan.util.images;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;
/**
 * 根据文字生成图片
 * @author wbtianhl
 *
 */
public class ImgForText {
	 /**
     * 图片的宽度。
     */
    private int width = 160;
    /**
     * 图片的高度。
     */
    private int height = 40;
    /**
     * 文字
     */
    private String text;
    /**
     * 文字图片Buffer
     */
    private BufferedImage buffImg;

    /**
     * 通过图片宽高进行构造
     * 
     * @param width
     *            图片宽
     * @param height
     *            图片高
     */
    public ImgForText(int width, int height,String text) {
        this.width = width;
        this.height = height;
        this.text = text;
        this.createImg();
    }


    /**
     * 生成图片
     */
    public void createImg() {
        int x = 0, fontHeight = 0, codeY = 0;
        int red = 0, green = 0, blue = 0;

        x = width / (text.length() + 2);// 每个字符的宽度
        fontHeight = height - 2;// 字体的高度
        codeY = height - 4;

        // 图像buffer
        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = buffImg.createGraphics();
        // 生成随机数
        Random random = new Random();
        // 增加下面代码使得背景透明  
        buffImg = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);  
        g.dispose();  
        g = buffImg.createGraphics();  
        // 背景透明代码结束 
        // 创建字体
        ImgFontByte imgFont = new ImgFontByte();
        Font font = imgFont.getFont(fontHeight);
        g.setFont(font);
        // 随机产生codeCount个字符的验证码。
        for (int i = 0; i < text.length(); i++) {
            String strRand = text.substring(i,i+1);
            // 产生随机的颜色值，让输出的每个字符的颜色值都将不同。
            red = random.nextInt(180);
            green = random.nextInt(120);
            blue = random.nextInt(180);
            g.setColor(new Color(red, green, blue));
            g.drawString(strRand, (i + 1) * x, codeY);
        }
    }

    /**
     * 将验证码保存到文件
     * 
     * @param path
     *            文件路径
     * @throws IOException
     *             输入输出异常
     */
    public void write(String path) throws IOException {
        OutputStream sos = new FileOutputStream(path);
        this.write(sos);
    }

    /**
     * 将输出流写入到图像数据缓冲区的图片
     * 
     * @param sos
     *            输出流
     * @throws IOException
     *             输入输出异常
     */
    public void write(OutputStream sos) throws IOException {
        ImageIO.write(buffImg, "png", sos);
        sos.close();
    }

    /**
     * 获取图像数据缓冲区的图片
     * 
     * @return 图像数据缓冲区的图片
     */
    public BufferedImage getBuffImg() {
        return buffImg;
    }


	public String getText() {
		return text;
	}


	public void setText(String text) {
		this.text = text;
	}

}
